package repository

import (
	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/model"
	"gorm.io/gorm"
)

// ItemRepository 定义物品仓库接口
// 提供物品相关的数据操作方法

type ItemRepository interface {
	// GetInventory 获取用户的物品列表
	GetInventory(userID int64) ([]model.UserItem, error)
	
	// AddItem 给用户添加物品
	AddItem(userID int64, itemID int64, quantity int) error
	
	// RemoveItem 从用户物品栏移除物品
	RemoveItem(userID int64, itemID int64, quantity int) error
	
	// UseItem 使用物品
	UseItem(userID int64, itemID int64) error
	
	// GetItem 获取物品详情
	GetItem(itemID int64) (*model.Item, error)
}

// itemRepository 实现物品仓库接口

type itemRepository struct {
	db *gorm.DB
}

// NewItemRepository 创建一个新的物品仓库实例
func NewItemRepository(db *gorm.DB) ItemRepository {
	return &itemRepository{db: db}
}

// GetInventory 获取用户的物品列表
func (r *itemRepository) GetInventory(userID int64) ([]model.UserItem, error) {
	var userItems []model.UserItem
	if err := r.db.Where("user_id = ?", userID).
		Preload("Item").
		Find(&userItems).Error;
	err != nil {
		return nil, err
	}
	return userItems, nil
}

// AddItem 给用户添加物品
func (r *itemRepository) AddItem(userID int64, itemID int64, quantity int) error {
	// 检查用户是否已经拥有该物品
	var userItem model.UserItem
	r.db.Where("user_id = ? AND item_id = ?", userID, itemID).First(&userItem)
	
	if userItem.ID > 0 {
		// 如果已经有该物品，则增加数量
		userItem.Quantity += quantity
		return r.db.Save(&userItem).Error
	} else {
		// 如果没有该物品，则创建新的记录
		newUserItem := model.UserItem{
			UserID:    userID,
			ItemID:    itemID,
			Quantity:  quantity,
		}
		return r.db.Create(&newUserItem).Error
	}
}

// RemoveItem 从用户物品栏移除物品
func (r *itemRepository) RemoveItem(userID int64, itemID int64, quantity int) error {
	var userItem model.UserItem
	r.db.Where("user_id = ? AND item_id = ?", userID, itemID).First(&userItem)
	
	if userItem.ID == 0 {
		// 用户没有该物品
		return nil
	}
	
	if userItem.Quantity > quantity {
		// 如果数量大于要移除的数量，则减少数量
		userItem.Quantity -= quantity
		return r.db.Save(&userItem).Error
	} else {
		// 如果数量小于或等于要移除的数量，则删除记录
		return r.db.Delete(&userItem).Error
	}
}

// UseItem 使用物品
func (r *itemRepository) UseItem(userID int64, itemID int64) error {
	return r.RemoveItem(userID, itemID, 1)
}

// GetItem 获取物品详情
func (r *itemRepository) GetItem(itemID int64) (*model.Item, error) {
	var item model.Item
	if err := r.db.First(&item, itemID).Error;
	err != nil {
		return nil, err
	}
	return &item, nil
}